# Mainnet forking

In some cases, you may want to connect to a network using a different `chainId` than its default. For example, your application is supposed to support the Mainnet network and forked Mainnet chain using [Tenderly](https://docs.tenderly.co/simulations-and-forks/simulation-api/testing/local-tests-on-top-of-mainnet-data-in-the-cloud/first-usage-of-tenderly-apis-in-tests), so the forked Mainnet should be accessible by a different number than the default `chainId` of the Mainnet, but the default for both networks it is the same which causes some problems.

## Example

So we may want to do something like this:

```tsx
const config: Config = {
  readOnlyChainId: Mainnet.chainId,
  readOnlyUrls: {
    [Mainnet.chainId]: 'https://mainnet.infura.io/v3/[your-infura-key]',
    1337: 'https://rpc.tenderly.co/fork/[your-mainnet-fork-id]',
  },
  multicallAddresses: {
    [Mainnet.chainId]: Mainnet.multicall2Address as string,
    1337: Mainnet.multicall2Address as string,
  },
  multicallVersion: 2 as const,
}
```

In this case, we want to have our forked Mainnet chain available on `chainId`: `1337`, which is the default for the Ganache network. But this won't work because it generates the provider with the same `chainId` as the default one, which is `1` for Mainnet.

## Solution

We can create a custom provider with overridden `chainId`:

```tsx
const customProvider = new providers.StaticJsonRpcProvider('https://rpc.tenderly.co/fork/xxx', {
  name: 'mainnet-fork',
  chainId: 1337,
})

const config: Config = {
  readOnlyChainId: Mainnet.chainId,
  readOnlyUrls: {
    [Mainnet.chainId]: 'https://mainnet.infura.io/v3/[your-infura-key]',
    1337: customProvider,
  },
  multicallAddresses: {
    [Mainnet.chainId]: Mainnet.multicall2Address as string,
    1337: Mainnet.multicall2Address as string,
  },
  multicallVersion: 2 as const,
}
```
